package io.openmessaging.storage.dledger.store;

import io.openmessaging.storage.dledger.MemberState;
import io.openmessaging.storage.dledger.entry.DLedgerEntry;

//存储抽象类
public abstract class DLedgerStore {

    public MemberState getMemberState() {
        return null;
    }

    //客户端 向主节点追加日志（数据）
    public abstract DLedgerEntry appendAsLeader(DLedgerEntry entry);

    //主节点 向从节点广播日志
    public abstract DLedgerEntry appendAsFollower(DLedgerEntry entry, long leaderTerm, String leaderId);

    //根据日志下标查找日志
    public abstract DLedgerEntry get(Long index);

    //获取已提交的日志序号
    public abstract long getCommittedIndex();

    //更新 committedIndex 的值，为空实现，由具体的存储子类实现
    public void updateCommittedIndex(long term, long committedIndex,String node) {
    }

    //获取Leader节点当前最大的投票轮次
    public abstract long getLedgerEndTerm();

    //获取Leader节点下一条日志写入的日志序号（最新日志的下标）
    public abstract long getLedgerEndIndex();

    //获取Leader节点第一条消息的日志序号
    public abstract long getLedgerBeginIndex();

    //更新Leader节点维护的ledgerEndIndex和ledgerEndTerm
    protected void updateLedgerEndIndexAndTerm() {
        if (getMemberState() != null) {
            getMemberState().updateLedgerIndexAndTerm(getLedgerEndIndex(), getLedgerEndTerm());
        }
    }

    //刷盘，空方法，由具体子类实现
    public void flush() {
    }

    //删除日志，空方法，由具体子类实现
    public long truncate(DLedgerEntry entry, long leaderTerm, String leaderId) {
        return -1;
    }

    //启动存储管理器，空方法，由具体子类实现
    public void startup() {
    }

    //关闭存储管理器，空方法，由具体子类实现
    public void shutdown() {
    }
}
